package com.xdxc.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.SignatureException;

import java.security.Key;
import java.util.*;
import java.util.function.Function;

public class JWTUtil {

    // 使用 Base64 编码的密钥
    private static final String SECRET_KEY = "5Xg7mzL8hN6JkRtQvSq2dsDFSFSDYGFYUFDFSG8FG78SDGFIAGRFG8Y9G0780N90N9VG8NVH980NH98S09NH80NH980NH98SVG0NH9SVGD9NH0D9NH0ESG0NH98SVGH9V9GFM0SPOICBJIOIJFDPSH98HBSU9DGFIDJIPFIPSNOHuYwV1x3Zc4Fb9Ae0KiUjWnMlCoDpBfThGdHyrOaI7P";

    // 将字符串密钥转换为 Key 对象
    private static final Key SIGNING_KEY = Keys.hmacShaKeyFor(Base64.getDecoder().decode(SECRET_KEY));

    /**
     * 生成JWT Token
     *
     * @param subject 用户ID
     * @return 生成的JWT Token
     */


    /**
     * 从JWT Token中提取用户名
     *
     * @param token JWT Token
     * @return 用户名
     */
    public static String extractUserId(String token) {
        return extractClaim(token, Claims::getSubject);
    }

    /**
     * 提取JWT Token中的声明信息
     *
     * @param token          JWT Token
     * @param claimsResolver 声明解析器
     * @param <T>            返回类型
     * @return 解析后的声明信息
     */
    public static <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = extractAllClaims(token);
        if (claims == null) {
            return null;
        }
        return claimsResolver.apply(claims);
    }

    /**
     * 提取JWT Token中的所有声明信息
     *
     * @param token JWT Token
     * @return 所有声明信息
     */
    public static Claims extractAllClaims(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(SIGNING_KEY)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
    }
    /**
     * 验证JWT Token是否有效
     *
     * @param token       JWT Token
     * @param Id    Id
     * @return 是否有效
     */
    public static Boolean validateToken(String token, String Id) {
        final String extractedUserId = extractUserId(token);
        return extractedUserId != null && extractedUserId.equals(Id) && !isTokenExpired(token);
    }

    /**
     * 检查JWT Token是否过期
     *
     * @param token JWT Token
     * @return 是否过期
     */
    public static Boolean isTokenExpired(String token) {
        Claims claims = extractAllClaims(token);
        return claims != null && extractClaim(token, Claims::getExpiration).before(new Date());
    }

    public static String generateToken(String identifier,Long userId, List<String> roles,Long time) {
        return Jwts.builder()
                .setSubject(identifier)
                .claim("roles", roles) // 嵌入角色列表
                .claim("userId", userId) // 新增用户ID字段
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + time))
                .signWith(SignatureAlgorithm.HS512, SIGNING_KEY) // 使用 HS512 算法
                .compact();
    }


}



